package net.csdn.modules.persist.mysql;
import com.google.inject.Inject;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import net.csdn.common.settings.Settings;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
import static net.csdn.common.logging.support.MessageFormat.format;
/**
* BlogInfo: WilliamZhu
* Date: 12-6-1
* Time: 下午9:11
*/
public class DataSourceManager {
private Map<String, DataSource> dataSourceMap;
private Settings settings;
@Inject
public DataSourceManager(Settings _settings) {
this.settings = _settings;
dataSourceMap = buildDataSourceMap();
}
public DataSource datasource(String name) {
return dataSourceMap.get(name);
}
public Map<String, DataSource> dataSourceMap() {
return dataSourceMap;
}
private Map<String, DataSource> buildDataSourceMap() {
Map<String, DataSource> tempDataSourceMap = new HashMap<String, DataSource>();
Map<String, Settings> groups = settings.getGroups("production.datasources");
for (Map.Entry<String, Settings> group : groups.entrySet()) {
if (group.getKey().equals("mysql")) {
tempDataSourceMap.put(group.getKey(), buildPool(group.getValue()));
}
}
return tempDataSourceMap;
}
private ComboPooledDataSource buildPool(Settings mysqlSetting) {
String url = "jdbc:mysql://{}:{}/{}?useUnicode=true&characterEncoding=utf8";
url = format(url, mysqlSetting.get("host", "127.0.0.1"), mysqlSetting.get("port", "3306"), mysqlSetting.get("database", "csdn_search_client"));
try {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(mysqlSetting.get("username"));
dataSource.setPassword(mysqlSetting.get("password"));
dataSource.setJdbcUrl(url);
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setInitialPoolSize(5);
dataSource.setMinPoolSize(5);
dataSource.setMaxPoolSize(10);
dataSource.setMaxStatements(50);
dataSource.setMaxIdleTime(60);
return dataSource;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}